/*
 * Copyright (C) 2010 Fores Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.fores.midori.core.io;

import java.io.IOException;
import java.io.OutputStream;

/**
 * サイズ計算用の出力ストリーム。<br>
 * (このクラスは処理効率を重視するため、あえてスレッドセーフにしていません。)<br>
 * <br>
 * このクラスはデータをどこにも出力せずに、単純にサイズだけを計算するための出力ストリームです。<br>
 * Content-Lengthの計算などに使用して下さい。<br>
 */
public class SizeCountOutputStream extends OutputStream {
	//==========================================================
	//フィールド

	/**
	 * サイズ
	 */
	private long size = 0L;


	//==========================================================
	//メソッド

	//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	//オーバーライドするメソッド

	/**
	 * サイズを+1します。<br>
	 * 対象のバイトは使用しません。<br>
	 * 
	 * @param b 対象のバイト
	 */
	@Override
	public void write(int b) throws IOException {
		//サイズを+1する
		this.size += 1;
	}

	/**
	 * サイズに指定されたバイト配列のサイズを加えます。<br>
	 * バイト配列の中身は使用しません。<br>
	 * 
	 * @param b バイト配列
	 */
	@Override
	public void write(byte[] b) throws IOException {
		//サイズに引数のバイト配列のサイズを加える
		this.size += b.length;
	}

	/**
	 * サイズに引数の書き込むバイト数を加えます。<br>
	 * バイト配列やオフセットは使用しません。<br>
	 * 
	 * @param b バイト配列
	 * @param off オフセット
	 * @param len 書き込むバイト数
	 */
	@Override
	public void write(byte[] b, int off, int len) throws IOException {
		//サイズに引数の書き込むバイト数 を加える
		this.size += len;
	}


	//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	//通常のメソッド

	/**
	 * 今までに出力されたサイズを取得します。<br>
	 * 
	 * @return 今までに出力されたサイズ
	 */
	public long getSize() {
		//フィールドの値をそのまま返す
		return this.size;
	}

	/**
	 * サイズを0に戻します。<br>
	 */
	public void resetSize() {
		//サイズを0に戻す
		this.size = 0;
	}
}
